為什麼前面要突然帶了一波實作呢?因為俗話說的好,Git 是不會騙人的,Git 上面有 commit 紀錄不怕專案是為了應付面試而一次全部貼上來的,細心一點話也可以看著一段一段時間的 commit 得知應徵者的技能進化史。
進入了框架的領域後,會有非常多物件導向的概念應用在實作中,物件導向已經是現代 web 開發中不可或缺的一個環節了,或許在面試的過程中應徵者可以很輕易的說出物件導向的三大特性:繼承、封裝、多型,但公司需要的畢竟還是一位開發者而不是一位學者。
以繼承來說,Model 就是一個很好的範例,為什麼只需要寫少少的 $fillable 屬性就可以實現跟資料庫的互動?那就是因為所有利用 php artisan make:model 創建出來的物件都有繼承 Model 這個抽象物件。只要 Model 這個父類別可以實現的功能,子類別都可以直接使用而不需要再寫一次。
講到繼承(extends)就必須講到他的好朋友:組合(implements)。繼承的概念是 is a 組合是 has a,以人當作範例,所有的人都會吃飯,所以吃飯這個行為就屬於適合寫在父類別的功能,如此一來兒子繼承父親、父親繼承爺爺,大家都會吃飯非常的合理。但打棒球這個行為就不適合寫在父類別來繼承使用,例如爺爺這一輩可能因為要忙著幫忙家務,所以爺爺從小都沒有習得打棒球這個技能,父親這一輩因為讀書至上的觀念所以家長不讓打棒球所以也沒有習得打棒球這個技能,而到了兒子這一輩因為世代觀念已經不一樣了所以會跟三五好友出去打棒球,也因為很多人都已經會打棒球了所以棒球已經有了一套完整的體系,所以打棒球這個技能就可以獨立出來寫成一個 Class 固定規則,再利用組合將其加入兒子的技能組,概念就會變成:兒子 is a 人,會吃飯,並且他 has a 技能,打棒球。
封裝的概念則簡單多了,封裝會將實現的過程隱藏起來,只告訴使用者使用介面及結果。舉例來說,手機拿起來只要按下照相的按鈕就可以獲得一張照片,完全不需要理解成像及儲存的原理。電話簿打開後只要選擇要通話的人按下通話鍵就可以與想通話的人通話,不用理解通訊原理。以現在的講法封裝就是懶人包啦!
雖然物件導向都說有三大概念,但至今我仍然與多型不熟,或許這也可以當成下一年度的學習目標。
回到面試這個環節,如果沒有實作的紀錄的話想要了解應徵者的實力就只能靠白板題或是問答互動,但這兩者的方式又會受到面試官的表達能力、應徵者的臨場反應等太多條件影響,有些應徵者可能有非常好的 Coding 能力但是容易緊張而表現失常,如果因為這樣而失去表現機會也是非常的可惜。如果有了專案實作的紀錄,就可以從應徵者的 Code 做舉例,從中了解應徵者的能力到底符不符合公司的需求,也不怕應徵到嘴砲型工程師,面試時講的天花亂墜、講得一嘴好 Code,然後一進公司實作就破功。